#include "Head.h"

const wchar_t *title_retrieve = {L"密码找回"};
const wchar_t *choices_retrieve[] = {
    L"选项1 - 退出",
    L"选项2 - 找回密码"};

const wchar_t *title_adm = {L"管理员界面"};
const wchar_t *choices_adm[] = {
    L"选项1 - 增加航班",
    L"选项2 - 删除航班",
    L"选项3 - 修改航班",
    L"选项4 - 航班排序",
    L"选项5 - 修改用户信息",
    L"选项6 - 添加管理员",
    L"选项7 - 退出"};

const wchar_t *title_user = {L"用户界面"};
const wchar_t *choices_user[] = {
    L"选项1 - 浏览航班",
    L"选项2 - 查询航班",
    L"选项3 - 查看订单",
    L"选项4 - 升级账号",
    L"选项5 - 修改密码",
    L"选项6 - 充值",
    L"选项7 - 购票",
    L"选项8 - 退票",
    L"选项9 - 退出"};

const wchar_t *title_upgrade = {L"升级账户"};
const wchar_t *choices_upgrade[] = {
    L"选项1 - 白银vip",
    L"选项2 - 黄金vip",
    L"选项3 - 白金vip",
    L"选项4 - 退出"};

// ============================= 注册 =============================
void Sign_up(User_Head_Node *Head, User_Head_Node *All, Flight_Head_Node *Flight_Head)
{
    char in_user[20];      // 注册输入名字
    char in_pas[10];       // 注册输入密码
    char in_pas_again[10]; // 再次输入密码
    int flog = 0;          // 是否注册成功标志
    int quit = 0;          // 是否退出标志位
    int err = 0;           // 记录密码输入错误次数
    int len = 0;           // 记录链表长度进行尾插

    while (1)
    {
        system("clear");
        printf("请输入您的账户名:");
        scanf("%s", in_user);
        if (Find_By_Name(All, in_user) == NULL) // 为空则证明 该用户名不存在 可以继续注册
        {
            printf("请输入您的密码:");
            getchar(); // 吃回车
            Conceal_Pas(in_pas);
            putchar('\n');
            printf("请再次输入您的密码:");
            // getchar(); // 吃回车
            Conceal_Pas(in_pas_again);
            break;
        }
        else
        {
            err++;
            system("clear");
            printf("\33[1m\33[31m账户名 已存在\r\33[0m");
            fflush(stdout);
            sleep(2);

            if (err % 2 == 0)
            {
                printf("若要退出请按1  继续请按其他任意键");
                scanf("%d", &quit);
                fflush(stdin);
                if (quit == 1)
                {
                    Progress_bar(); // 进度条
                    break;
                }
            }
        }
    }

    err = 0;
    while (1)
    {
        if (!strcmp(in_pas, in_pas_again)) // 如果两次密码相同 则注册成功
        {
            system("clear");

            flog = 1; // 注册标志位赋值为1

            // 对用户数据进行赋值
            User_data user_data = {.balance = 0, .Account_level = Reg};
            strcpy(user_data.user, in_user);
            strcpy(user_data.pas, in_pas);

            User_Node *ptr = All->next;
            while (ptr != NULL)
            {
                ptr = ptr->next;
                len++;
            }

            // 写入链表
            Insert_List(All, user_data, ++len);
            // 写入文件
            File_Printf_User(All, ALL_USER);
            printf("恭喜您,注册成功 欢迎来到 \"中国民航\"!\r");
            fflush(stdout);
            sleep(1);
            break;
        }
        err++;
        if (err % 2 == 0 && in_pas != in_pas_again)
        {
            printf("若要退出请按1  继续请按其他任意键");
            scanf("%d", &quit);
            fflush(stdin);
            if (quit == 1)
            {
                Progress_bar(); // 进度条
                break;
            }
        }
        if (err < 2)
        {
            putchar('\n');
        }
        else
        {
            getchar();
        }

        printf("请再次输入您的密码:");
        Conceal_Pas(in_pas_again);
    }

    if (flog == 1) // 进入用户界面
    {
        Log_in(All, Flight_Head);
    }
}

// ============================= 登录 =============================
void Log_in(User_Head_Node *All_Uear, Flight_Head_Node *Flight_Head)
{
    char in_user[20];      // 登录时输入名字
    char in_pas[10] = {0}; // 登录时输入密码

    int flog = 0; // 是否登录成功标志
    int quit = 0; // 是否退出标志位
    int err = 0;  // 记录密码输入错误次数

    User_Node *ptr; // 储存用户节点地址

    while (1)
    {
        system("clear");
        printf("请输入您的账号:");
        scanf("%s", in_user);
        ptr = Find_By_Name(All_Uear, in_user); // 查找名字返回地址
        if (ptr != NULL)
        {
            printf("账户名正确\n");
            system("clear");
            printf("请输入您的密码:");
            getchar();                          // 吃回车
            Conceal_Pas(in_pas);                // 密码加密
            if (!strcmp(in_pas, ptr->data.pas)) // 比对密码
            {
                flog = 1;
                system("clear");
                printf("登录成功!!!\r");
                fflush(stdout);
                sleep(1.5);
                break;
            }
            else
            {
                system("clear");
                printf("\33[1m\33[31m密码错误!!! 请重新输入\33[0m\r");
                err++;
                fflush(stdout);
                sleep(2);
            }
        }
        else
        {
            printf("\33[1m\33[31m账户名错误!!!\33[0m\n");
            fflush(stdout);
            sleep(1.5);
            err++;
        }

        if (err % 3 == 0)
        {
            system("clear");
            printf("\33[1m\33[31m请稍后在试...\33[0m\n");
            printf("退出请按1,继续按其他任意键即可");
            scanf("%d", &quit);
            if (quit == 1)
            {
                break;
            }
            fflush(stdout);
            Progress_bar();
        }
    }

    if (flog == 1)
    {
        user_interface(ptr, All_Uear, Flight_Head);
    }
    else
    {
        // 找回密码或 退出程序
    }
}

// =========================== 用户界面 ===========================

void user_interface(User_Node *User, User_Head_Node *User_Head, Flight_Head_Node *Flight_Head)
{
    plane();
    system("clear");
    // 判断是否是管理员
    int flog = strcmp(User->data.Account_level, Adm);
    int Exit = 0; // 退出
    //============================= 管理员界面 =============================
    if (flog == 0)
    {
        while (1)
        {
            // File_Scanf_User(User_Head , ALL_USER); // 重新读取文件
            int mode = display_menu(title_adm, choices_adm, 7);
            char quit;
            switch (mode)
            {
            case 1:
                Flight_Add(Flight_Head); // 增加航班
                break;

            case 2:
                Flight_Del(Flight_Head); // 删除航班
                break;

            case 3:
                Flight_Modify(Flight_Head); // 修改航班
                break;

            case 4:
                Flight_Sort(Flight_Head); // 航班排序
                break;

            case 5:
                User_Add(User_Head); // 修改用户信息
                printf("\"回车\"退出");
                getchar();
                scanf("%c", &quit);
                if (quit == '\n')
                {
                    break;
                }

            case 6:
                Adm_Add(User_Head); // 添加管理员
                printf("\"回车\"退出");
                scanf("%c", &quit);
                if (quit == '\n')
                {
                    break;
                }

            case 7:
                Progress_bar(); // 退出
                Exit = 1;

            default:
                break;
            }
            if (Exit == 1)
            {
                break;
            }
        }
    }
    //============================= 用户界面 =============================
    else
    {
        while (1)
        {
            int mode = display_menu(title_user, choices_user, 9);
            char quit;
            switch (mode)
            {
            case 1:
                // 浏览所有航班
                Flight_Browse(Flight_Head);
                printf("\"回车\"退出");
                scanf("%c", &quit);
                if (quit == '\n')
                {
                    break;
                }

            case 2:
                // 查询航班
                Flight_Inquire(Flight_Head);
                printf("\"回车\"退出");
                getchar(); // 吃回车
                scanf("%c", &quit);
                if (quit == '\n')
                {
                    break;
                }

            case 3:
                // 查看订单
                Inquire_Ticket(User);
                printf("\"回车\"退出");
                scanf("%c", &quit);
                if (quit == '\n')
                {
                    break;
                }

            case 4:
                // 升级账户
                User_Upgrade(User, User_Head);
                break;

            case 5:
                // 修改密码
                Modify_Pas(User, User_Head);
                printf("\"回车\"退出");
                scanf("%c", &quit);
                if (quit == '\n')
                {
                    break;
                }

            case 6:
                // 充值
                Pay(User, User_Head);
                printf("\"回车\"退出");
                scanf("%c", &quit);
                if (quit == '\n')
                {
                    break;
                }

            case 7:
                // 购票
                Buy_Air_Ticket(Flight_Head, User_Head, User);
                printf("\"回车\"退出");
                getchar(); // 吃回车
                scanf("%c", &quit);
                if (quit == '\n')
                {
                    break;
                }

            case 8:
                // 退票
                Return_Ticket(Flight_Head, User_Head, User);
                printf("\"回车\"退出");
                getchar(); // 吃回车
                scanf("%c", &quit);
                if (quit == '\n')
                {
                    break;
                }

            case 9:
                // 退出
                Progress_bar();
                Exit = 1;
                break;

            default:
                break;
            }
            if (Exit == 1)
            {
                break;
            }
        }
    }
}

// 浏览所有航班
void Flight_Browse(Flight_Head_Node *Flight_Head)
{
    system("clear");
    // 航班按时间排序
    Flight_Sort(Flight_Head);
    // 遍历
    Print_dlist(Flight_Head);
    return;
}

// 查询航班 班次/终点
Flight_Node *Flight_Inquire(Flight_Head_Node *Head)
{
    system("clear");

    int mode = 99;
    Flight_Node *ptr = NULL; // 接收查询到的航班信息

    printf("航班查询 终点(1) or 班次(0) :");
    scanf("%d", &mode);
    if (mode == 1)
    {
        char flight[20];
        printf("请输入你要查询的航班终点站");
        scanf("%s", flight);
        ptr = Find_by_arrive(Head, flight);

        if (ptr == NULL)
        {
            return NULL;
        }

        system("clear");
        // 遍历
        printf("航班班次\t飞机机型\t起点站\t终点站\t起飞时间\t到达时间\t飞行时间\t票价\t额定载客量\t剩余座位数\t是否已经起飞\n");
        printf("  %-10d\t%-10s\t%-10s%-10s%-d : %d\t\t%d : %d\t\t%-10s\t%-10d%-5d\t\t  %d\t\t  %-8c\n",
               /*航班                  飞机机型                 航班起点站                    航班终点站*/
               ptr->data.id, ptr->data.flighttype, ptr->data.startcity, ptr->data.arrivecity,
               /*起飞时间 时            起飞时间 分              到达时间 时                   到达时间 分*/
               ptr->data.starttime[0], ptr->data.starttime[1], ptr->data.arrivetime[0], ptr->data.arrivetime[1],
               /*飞行时间               票价                    额定载客量                    剩余座位数*/
               ptr->data.flytime, ptr->data.value, ptr->data.maxNUM, ptr->data.leftbuyersa,
               /*是否起飞*/
               ptr->data.whetherfly);
        return ptr;
    }
    else if (mode == 0)
    {
        int idx = 0;
        printf("请输入你要查询的航班班次");
        scanf("%d", &idx);
        ptr = Find_by_id(Head, idx);

        if (ptr == NULL)
        {
            printf("\33[1m\33[31m未查询到您搜索的航班\33[0m\n");
            return NULL;
        }

        system("clear");
        // 遍历
        printf("航班班次\t飞机机型\t起点站\t终点站\t起飞时间\t到达时间\t飞行时间\t票价\t额定载客量\t剩余座位数\t是否已经起飞\n");
        printf("  %-10d\t%-10s\t%-10s%-10s%-d : %d\t\t%d : %d\t\t%-10s\t%-10d%-5d\t\t  %d\t\t  %-8c\n",
               /*航班                  飞机机型                 航班起点站                    航班终点站*/
               ptr->data.id, ptr->data.flighttype, ptr->data.startcity, ptr->data.arrivecity,
               /*起飞时间 时            起飞时间 分              到达时间 时                   到达时间 分*/
               ptr->data.starttime[0], ptr->data.starttime[1], ptr->data.arrivetime[0], ptr->data.arrivetime[1],
               /*飞行时间               票价                    额定载客量                    剩余座位数*/
               ptr->data.flytime, ptr->data.value, ptr->data.maxNUM, ptr->data.leftbuyersa,
               /*是否起飞*/
               ptr->data.whetherfly);
        return ptr;
    }
    printf("\33[1m\33[31mERR-\"格式错误\"\33[0m\n");
    return NULL;
}

// 查询用户信息 购入的机票
void Inquire_Ticket(User_Node *User)
{
    system("clear");
    printf("航班班次\t飞机机型\t起点站\t终点站\t起飞时间\t到达时间\t飞行时间\t票价\t额定载客量\t剩余座位数\t是否已经起飞\n");
    Printf_Sql_list(User->data.Order);
}

// 修改密码
void Modify_Pas(User_Node *User, User_Head_Node *Head)
{
    char pas[10];        // 输入密码
    char modify_pas[10]; // 修改密码
    int err = 0;         // 密码错误次数
    char quit;           // 退出

    while (1)
    {
        system("clear");
        printf("请输入您的密码:");
        // if (err == 0)
        // {
        //     getchar(); // 吃回车1
        // }
        Conceal_Pas(pas);
        putchar('\n');
        if (!strcmp(pas, User->data.pas)) // 密码正确
        {
            while (1)
            {
                printf("请输入您要修改的密码:");
                Conceal_Pas(modify_pas);
                putchar('\n');
                if (strcmp(modify_pas, User->data.pas)) // 修改的密码和之前的密码 不相同
                {
                    strcpy(User->data.pas, modify_pas); // 修改密码

                    if (!strcmp(modify_pas, User->data.pas)) // 是否修改成功
                    {
                        // 写入文件
                        File_Printf_User(Head, ALL_USER);

                        printf("修改成功!\r");
                        fflush(stdout);
                        sleep(2);
                        break; // 跳出小循环
                    }
                }
                else // 修改的密码和之前的密码 相同
                {
                    system("clear");
                    printf("\33[1m\33[31m密码与修改前密码相同!!!\33[0m\n");
                }
            }
            break; // 跳出大循环
        }
        else // 密码错误
        {
            system("clear");
            printf("\33[1m\33[31m密码错误!!!请重新输入\33[0m\r");
            fflush(stdout);
            sleep(2);
            err++;
        }
        if (err % 3 == 0) // 错误三次 继续 或 退出
        {
            system("clear");
            printf("\33[1m\33[33m请稍后在试...\33[0m\n");
            printf("退出请按\"1\"   继续请按\"回车\"");
            scanf("%c", &quit);
            if (quit == '1')
            {
                break;
            }
            else if (quit == '\n')
            {
                fflush(stdout);
                Progress_bar();
                continue;
            }
        }
    }
}

// 充值
void Pay(User_Node *User, User_Head_Node *Head)
{
    system("clear");
    int balance = 0;       // 输入余额
    int balance_judge = 0; // 判断充值是否成功
    char pas[10];          // 输入密码
    int err = 0;           // 密码错误次数
    char quit;             // 退出

    // 输入金额
    printf("请输入您需要充值的金额:");
    scanf("%d", &balance);

    // 输入密码
    while (1)
    {
        system("clear");
        printf("请输入您的密码:");
        if (err == 0)
        {
            getchar(); // 吃回车
        }
        Conceal_Pas(pas);
        if (!strcmp(pas, User->data.pas))
        {
            system("clear");

            // 充值
            balance_judge = User->data.balance;
            User->data.balance += balance;
            balance_judge += balance;

            // 写入文件
            File_Printf_User(Head, ALL_USER);

            // 判断是否充值成功
            if (User->data.balance == balance_judge)
            {
                printf("充值成功!\n");
            }
            else
            {
                printf("充值失败!\n");
            }

            // 查看余额
            printf("您的余额为:%d\n", User->data.balance);

            break;
        }
        else
        {
            system("clear");
            printf("\33[1m\33[31m密码错误!!! 请重新输入\33[0m\r");
            err++;
            fflush(stdout);
            sleep(1.5);
        }
        if (err % 3 == 0)
        {
            system("clear");
            printf("\33[1m\33[33m请稍后在试...\33[0m\n");
            printf("退出请按\"1\"   继续请按\"回车\"");
            scanf("%c", &quit);
            if (quit == '1')
            {
                break;
            }
            else if (quit == '\n')
            {
                fflush(stdout);
                Progress_bar();
                continue;
            }
        }
    }
}

// 升级vip
void User_Upgrade(User_Node *User, User_Head_Node *Head)
{
    while (1)
    {
        system("clear");
        int user_upg = display_menu(title_upgrade, choices_upgrade, 4);
        char ent;     // 升级确认
        int quit = 0; // 退出

        // // 读取所有用户文件
        // File_Scanf_User(Head , ALL_USER);

        switch (user_upg)
        {
        case 1:
            // 升级为白银用户
            printf("确认升级为白银用户吗? \"y\" or \"n\"");
            scanf("%c", &ent);
            if (ent == 'y')
            {
                // 判断用户余额
                if (User->data.balance < 200)
                {
                    printf("\33[1m\33[31m余额不足!请先充值\33[0m");
                    fflush(stdout);
                    sleep(2);
                    break;
                }
                // 扣钱
                User->data.balance -= 200;

                // 升级
                strcpy(User->data.Account_level, Sil);

                // 写入文件
                File_Printf_User(Head, ALL_USER);

                if (!strcmp(User->data.Account_level, Sil))
                {
                    printf("恭喜您升级为尊贵的白银用户,购买机票享9折优惠\r");
                    fflush(stdout);
                    sleep(2);
                    break;
                }
            }
            else if (ent == 'n')
            {
                break;
            }

        case 2:
            // 升级为黄金用户
            printf("确认升级为黄金用户吗? \"y\" or \"n\"");
            scanf("%c", &ent);
            if (ent == 'y')
            {
                // 判断用户余额
                if (User->data.balance < 300)
                {
                    printf("\33[1m\33[31m余额不足!请先充值\33[0m");
                    fflush(stdout);
                    sleep(2);
                    break;
                }
                // 扣钱
                User->data.balance -= 300;

                // 升级
                strcpy(User->data.Account_level, Gol);

                // 写入文件
                File_Printf_User(Head, ALL_USER);

                if (!strcmp(User->data.Account_level, Gol))
                {
                    printf("恭喜您升级为尊贵的黄金用户,购买机票享8折优惠\r");
                    fflush(stdout);
                    sleep(2);
                    break;
                }
            }
            else if (ent == 'n')
            {
                break;
            }

        case 3:
            // 升级为白金用户
            printf("确认升级为白金用户吗? \"y\" or \"n\"");
            scanf("%c", &ent);
            if (ent == 'y')
            {
                // 判断用户余额
                if (User->data.balance < 500)
                {
                    printf("\33[1m\33[31m余额不足!请先充值\33[0m");
                    fflush(stdout);
                    sleep(2);
                    break;
                }
                // 扣钱
                User->data.balance -= 500;

                // 升级
                strcpy(User->data.Account_level, Pla);

                // 写入文件
                File_Printf_User(Head, ALL_USER);

                if (!strcmp(User->data.Account_level, Pla))
                {
                    printf("恭喜您升级为尊贵的白银用户,购买机票享7折优惠\r");
                    fflush(stdout);
                    sleep(2);
                    break;
                }
            }
            else if (ent == 'n')
            {
                break;
            }
        case 4:
            // 退出
            quit = 1;
            break;

        default:
            quit = 1;
            break;
        }
        if (quit == 1)
        {
            break;
        }
    }
}

// 购票 成功(余票-1 / 扣余额) 失败(飞机已经起飞 / 余额不足 / 机票售空) vip打折
void Buy_Air_Ticket(Flight_Head_Node *Head, User_Head_Node *User_Head, User_Node *User)
{
    system("clear");
    char ent;                              // 确认购买
    int balance_folg = User->data.balance; // 用户购票前的余额

    Flight_Node *ptr = Flight_Inquire(Head); // 查询要购买的机票

    if (ptr == NULL)
    {
        printf("\33[1m\33[31m未查询到该航班信息\33[0m\n");
        return;
    }

    // 判断飞机是否起飞
    if (ptr->data.whetherfly == 'y')
    {
        printf("飞机已起飞!\n");
        return;
    }

    // 判断机票是否售空
    if (ptr->data.leftbuyersa == 0)
    {
        printf("\33[1m\33[33m该航班机票已售空,请查询其余航班~\33[0m\n");
        return;
    }

    printf("是否购买该机票? \"y\" or \"n\"");
    getchar();
    scanf("%c", &ent);
    if (ent == 'y')
    {
        // 支付 判断用户VIP等级
        // ================= 普通用户 =================
        if (!strcmp(User->data.Account_level, Reg))
        {
            if (User->data.balance < ptr->data.value) // 判断余额
            {
                printf("\33[1m\33[31m余额不足!请先充值\33[0m\n");
                return;
            }
            User->data.balance -= ptr->data.value; // 扣钱
        }
        // ================= 白银用户 =================
        else if (!strcmp(User->data.Account_level, Sil))
        {
            if (User->data.balance < (ptr->data.value * SILVER_DISCOUNT)) // 判断余额
            {
                printf("\33[1m\33[31m余额不足!请先充值\33[0m\n");
                return;
            }
            User->data.balance -= (ptr->data.value * SILVER_DISCOUNT); // 扣钱
        }
        // ================= 黄金用户 =================
        else if (!strcmp(User->data.Account_level, Gol))
        {
            if (User->data.balance < (ptr->data.value * GOLD_DISCOUNT)) // 判断余额
            {
                printf("\33[1m\33[31m余额不足!请先充值\33[0m\n");
                return;
            }
            User->data.balance -= (ptr->data.value * GOLD_DISCOUNT); // 扣钱
        }
        // ================= 白金用户 =================
        else if (!strcmp(User->data.Account_level, Pla))
        {
            if (User->data.balance < (ptr->data.value * PLATINUM_DISCOUNT)) // 判断余额
            {
                printf("\33[1m\33[31m余额不足!请先充值\33[0m\n");
                return;
            }
            User->data.balance -= (ptr->data.value * PLATINUM_DISCOUNT); // 扣钱
        }

        if (User->data.balance != balance_folg) // 判断是否扣钱
        {
            system("clear");
            printf("购买成功!\n");

            // 买票
            Insert_Sql_list(User->data.Order, ptr->data);

            ptr->data.leftbuyersa--; // 余票减1

            // 写入用户文件
            File_Printf_User(User_Head, ALL_USER);
            // 写入航班文件
            File_Printf_Flight(Head);
            return;
        }
    }
    else if (ent == 'n')
    {
        return;
    }
}

// 退票 查询用户购入的机票 选择要退的机票 成功(余票+1 / 余额返还) 失败(已经起飞)
void Return_Ticket(Flight_Head_Node *Head, User_Head_Node *User_Head, User_Node *User)
{
    system("clear");
    int idx = 0; // 查询航班班次
    char ent;
    Flight_Node *ptr = NULL;

    if (User->data.Order->len == 0)
    {
        printf("\33[1m\33[33m抱歉,您的航班订单为空\33[0m\n");
        return;
    }
    while (1)
    {
        system("clear");
        // 显示 用户所有航班订单
        Inquire_Ticket(User);

        printf("请输入你要退订的航班班次");
        // getchar();
        scanf("%d", &idx);

        // 循环遍历 判断用户订单中是否有 该航班订单
        for (size_t i = 0; i < User->data.Order->len; i++)
        {
            int balance_folg = User->data.balance; // 用户退款前的余额

            // 查询订单中有无该航班号
            if (User->data.Order->Order_Data[i].id == idx) // 有
            {
                ptr = Find_by_id(Head, idx); // 接收该航班信息

                // 判断飞机是否起飞
                if (ptr->data.whetherfly == 'y')
                {
                    printf("\33[1m\33[33m飞机已起飞\33[0m\n");
                    return;
                }

                printf("是否退订该航班? \"y\" or \"n\"");
                getchar();
                scanf("%c", &ent);
                if (ent == 'y') // 确认退订该航班
                {
                    // 判断用户VIP等级
                    // ================= 普通用户 =================
                    if (!strcmp(User->data.Account_level, Reg))
                    {
                        User->data.balance += ptr->data.value; // 还钱
                    }
                    // ================= 白银用户 =================
                    else if (!strcmp(User->data.Account_level, Sil))
                    {
                        User->data.balance += (ptr->data.value * SILVER_DISCOUNT); // 扣钱
                    }
                    // ================= 黄金用户 =================
                    else if (!strcmp(User->data.Account_level, Gol))
                    {
                        User->data.balance += (ptr->data.value * GOLD_DISCOUNT); // 扣钱
                    }
                    // ================= 白金用户 =================
                    else if (!strcmp(User->data.Account_level, Pla))
                    {
                        User->data.balance += (ptr->data.value * PLATINUM_DISCOUNT); // 扣钱
                    }

                    if (User->data.balance != balance_folg) // 判断是否还钱
                    {
                        system("clear");
                        // 判断该航班在第几个
                        for (size_t i = 0; i < User->data.Order->len; i++)
                        {
                            if (ptr->data.id == User->data.Order->Order_Data[i].id) // 航班班次相等
                            {
                                if (!strcmp(ptr->data.arrivecity, User->data.Order->Order_Data[i].arrivecity)) // 航班目的地相等
                                {
                                    // 删除该航班订单
                                    Del_Sql_list(User->data.Order, i);

                                    ptr->data.leftbuyersa++; // 余票减1

                                    // 写入用户文件
                                    File_Printf_User(User_Head, ALL_USER);
                                    // 写入航班文件
                                    File_Printf_Flight(Head);
                                    printf("退票成功!\n");
                                    break;
                                }
                            }
                        }
                        return;
                    }
                }
                else if (ent == 'n')
                {
                    return;
                }
            }
        }
        printf("您的航班订单中有无该航班信息\n");
    }
}

// =========================== 用户管理 ===========================

// 添加管理员用户
void Adm_Add(User_Head_Node *All)
{
    system("clear");
    User_data adm_data;
    printf("请输入该航班管理员的信息\n");
    printf("账户名:");
    scanf("%s", adm_data.user);

    // 循环遍历判断是否已经存在该用户
    User_Node *ptr = All->next;
    for (size_t i = 0; ptr != NULL; i++)
    {
        if (!strcmp(ptr->data.user, adm_data.user)) // 用户名相同
        {
            printf("\33[1m\33[31m该账户名已存在!\33[0m\n");
            return;
        }
        ptr = ptr->next;
    }

    printf("密码:");
    getchar();
    Conceal_Pas(adm_data.pas);
    adm_data.balance = 0;
    strcpy(adm_data.Account_level, Adm);

    // 写入链表
    Insert_List(All, adm_data, 1);
    if (Find_By_Name(All, adm_data.user) != NULL)
    {
        printf("管理员添加成功\n");
    }

    // 写入文件
    File_Printf_User(All, ALL_USER);

    return;
}

// 修改用户信息
void User_Add(User_Head_Node *All)
{
    system("clear");
    char user[20];
    Printf_List(All);
    printf("请输入要删除用户的用户名");
    scanf("%s", user);
    User_Node *ptr_name = Find_By_Name(All, user);
    if (ptr_name == NULL)
    {
        printf("\33[1m\33[31m不存在该用户\33[0m\n");
        return;
    }

    // 遍历出该用户在第几个
    User_Node *ptr = All->next;
    for (size_t i = 0; ptr != NULL; i++)
    {
        if (!strcmp(ptr->data.user, ptr_name->data.user))
        {
            Del_List(All, ++i);
            break;
        }
        ptr = ptr->next;
    }

    if (Find_By_Name(All, user) == NULL)
    {
        printf("用户删除成功\n");
    }

    // 写入文件
    File_Printf_User(All, ALL_USER);
    return;
}
